package chatNI;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

import javax.rmi.CORBA.Util;

import chatControler.ChatControler;
import chatModel.*;

/**
 * Cette classe est le Thread qui gère la reception du fichier
 *
 */
public class ThreadTcpRecup extends Thread{
	
	private ServerSocket serverSocket;
	private File file;
	private ChatControler chatControler;
	private UtilisateurDistant user;
	
        /**
         * Constructeur
         * @param serverSocket Socket dans lequel va passer le fichier pour la reception
         * @param file Fichier qui contiendra le fichier reçu
         * @param chatControler ChatControler pour l'avertir de la reception d'un fichier
         * @param user Utilisateur distant qui va émettre le fichier
         */
	public ThreadTcpRecup(ServerSocket serverSocket, File file, ChatControler chatControler, UtilisateurDistant user) {
		this.serverSocket = serverSocket;
		this.file=file;
		this.chatControler = chatControler;
		this.user=user;
	}
	
        /**
         * Méthode qui exécute les actions à mener lors du démarrage du Thread
         */
	public void run(){
		rcvFile( this.serverSocket, this.file);
		try {
			this.serverSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
        /**
         * Méthode qui reçoit le fichier en récupérant physiquement les données
         * sur le réseau
         * @see chatControler.ChatControler#fichierRecu(chatModel.UtilisateurDistant) fichierRecu
         * @param serverSocket Socket dans lequel passe le fichier
         * @param file Fichier conteneur pour la réception
         */
	public void rcvFile(ServerSocket serverSocket, File file){
		Socket echange_donnee=null;
		InputStream fichierDEntree=null;
		OutputStream fichierDeSortie=null;
		
		try {
			echange_donnee=serverSocket.accept();
			fichierDEntree = echange_donnee.getInputStream();
			fichierDeSortie = new FileOutputStream(file);
			
			byte[] toRcv = new byte[1024];
			int i;
			while (( i = fichierDEntree.read(toRcv)) != -1){
				fichierDeSortie.write(toRcv, 0, i);
			}
			this.chatControler.fichierRecu(user);
			
			
		} catch (IOException e) {
			System.out.println("probleme avec l'accept de la socket");
			e.printStackTrace();
		}
		finally{
			try {
				fichierDEntree.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				fichierDeSortie.flush();
				fichierDeSortie.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				echange_donnee.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	

}
